// #include <stdio.h>
// #include <stdlib.h>
// #include <stdbool.h>
// #include"windows.h"
// #define MAX_SIZE 100
//
// typedef struct {
//     char data[MAX_SIZE];
//     int top;
// } Stack;
//
// void initStack(Stack* s) {
//     s->top = -1;
// }
//
// bool isStackEmpty(Stack* s) {
//     return s->top == -1;
// }
//
// bool isStackFull(Stack* s) {
//     return s->top == MAX_SIZE - 1;
// }
//
// bool push(Stack* s, char c) {
//     if (isStackFull(s)) {
//         printf("Stack is full!\n");
//         return false;
//     }
//     s->data[++s->top] = c;
//     return true;
// }
//
// bool pop(Stack* s, char* c) {
//     if (isStackEmpty(s)) {
//         printf("Stack is empty!\n");
//         return false;
//     }
//     *c = s->data[s->top--];
//     return true;
// }
//
// bool isMatchingPair(char opening, char closing) {
//     return (opening == '(' && closing == ')') ||
//            (opening == '{' && closing == '}') ||
//            (opening == '[' && closing == ']');
// }
//
// bool areParenthesesBalanced(const char* expression) {
//     Stack s;
//     initStack(&s);
//
//     for (int i = 0; expression[i] != '\0'; i++) {
//         if (expression[i] == '(' || expression[i] == '{' || expression[i] == '[') {
//             push(&s, expression[i]);
//         } else if (expression[i] == ')' || expression[i] == '}' || expression[i] == ']') {
//             if (isStackEmpty(&s)) {
//                 return false;
//             }
//             char top;
//             pop(&s, &top);
//             if (!isMatchingPair(top, expression[i])) {
//                 return false;
//             }
//         }
//     }
//
//     return isStackEmpty(&s);
// }
//
// int main() {
//     SetConsoleOutputCP(CP_UTF8);
//     char expression[] = "{[()]}";
//     if (areParenthesesBalanced(expression)) {
//         printf("Parentheses are balanced.\n");
//     } else {
//         printf("Parentheses are not balanced.\n");
//     }
//     return 0;
// }